package 斗地主版本2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

public class QuasiShampooTwo {
    //牌盒hashBox
    //利用键与值创建牌盒
    /*
    利用HashMap的有序特性创建牌盒
    Integer:表示编码   编码为管理牌做准备
    String:表示color和number
     */
    static HashMap<Integer,String> hashBox=new HashMap<>();
    //存储牌的序号,方便发牌的时候利用序号进行管理
    static ArrayList<Integer> ordinal=new ArrayList<>();

    //准备四个集合
    //玩家一
    static TreeSet<Integer> gamerOne=new TreeSet<>();
    //玩家二
    static TreeSet<Integer> gamerTwo=new TreeSet<>();
    //玩家三
    static TreeSet<Integer> gamerThree=new TreeSet<>();
    //底牌
    static TreeSet<Integer> Cards=new TreeSet<>();

    //准备牌
    static {
        //准备牌的花色
        String[] color={"♦","♣","♥","♠"};
        //准备牌的数字
        String[] number={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};

        //记录序号
        int encode=1;
        /*
        将牌添加到牌盒当中
            number:表示数字
            color:表示花色
            让数字匹配花色
         */
        for (String s : number) {
            for (String s1 : color) {
                hashBox.put(encode,s+s1);
                //将编码添加到定义的序列ordinal当中
                ordinal.add(encode);
                //没添加一次就将encode进行增加
                encode++;
            }
        }
        hashBox.put(encode,"小王");
        //将编码添加到定义的序列ordinal当中
        ordinal.add(encode);
        encode++;
        hashBox.put(encode,"大王");
        //将编码添加到定义的序列ordinal当中
        ordinal.add(encode);
        //因为encode默认为1所以最后一张牌不需要进行自增了

        //打印
        System.out.println(hashBox);

    }

    //主方法
    public QuasiShampooTwo(){
        //洗牌
        Collections.shuffle(ordinal);

        //检测
        //System.out.println(ordinal);

        //发牌
        deal();

        //检查
//        System.out.println("玩家一"+gamerOne);
//        System.out.println("玩家二"+gamerTwo);
//        System.out.println("玩家三"+gamerThree);

        //看牌
        lookPaker("底牌",Cards);
        lookPaker("孙权",gamerOne);
        lookPaker("曹操",gamerTwo);
        lookPaker("刘备",gamerThree);

    }

    //看牌
    private static void lookPaker(String name,TreeSet<Integer> tree) {
        System.out.print(name+":");
        //遍历TreeSet集合得到每一个编码，再1拿着编码获取到牌
        for (Integer integer : tree) {
            //利用get获取牌盒hashBox中的牌
            String pokr=hashBox.get(integer);
            System.out.print(pokr+" ");
        }
        System.out.println();
    }

    //发牌
    public static void deal() {
        for (int i=0;i<ordinal.size();i++) {
            //利用遍历获取集合ordinal的元素
            int number=ordinal.get(i);

            //底牌 Cards
            if(i<=2){
                Cards.add(number);
            }

            //利用取余判断发给那位玩家
            int remainder=i%3;
            /*
            余数为0：发给玩家一 gamerOne
            余数为1：发给玩家二 gamerTwo
            余数为2：发给玩家三 gamerThree
             */
            if (remainder<=0){
                //给玩家一发牌
                gamerOne.add(number);
            }else if (remainder<=1){
                //给玩家二发牌
                gamerTwo.add(number);
            }else if (remainder<=2){
                //给玩家三发牌
                gamerThree.add(number);
            }else{
                System.out.println("数据错误!");
            }
        }
    }
}
